% pca，计算降维前后的协方差矩阵&pca后的数据
% 数据的注释：行是数据对象，列是属性,32维降至5维

%%
% 读入数据
clear;clc;
data=load('ColorHistogram.asc');
% 去掉第一列序号
data=data(:,2:33);

%%
% 中心化，去平均值，计算协方差矩阵
dataLength=length(data);
data=bsxfun(@minus,data,mean(data));
Cx=data'*data/(dataLength-1);
disp('变换前的协方差矩阵：');
disp(Cx);

%%
% 得到协方差矩阵的特征值D和特征向量V，对应的列是单个特征向量
[V,D]=eig(Cx);

%%
% 获得最大的k个特征值对应的特征向量P
DData=max(D);
ChNum=size(data,2);
k=5;
P=zeros(ChNum,k);

for i=1:k
    maxIndex=find(max(DData)==DData);
    DData(maxIndex)=-1;
    P(:,i)=V(:,maxIndex);
end

%%
% 计算变换后的数据
Y=P'*data';
disp('变换后的数据：');
Y=Y';
disp(Y);

%%
Y=bsxfun(@minus,Y,mean(Y));
% 计算变换后的数据的协方差矩阵
Cy=Y'*Y/(dataLength-1);
disp('变换后的协方差矩阵：');
disp(Cy);

